﻿#define _CRT_SECURE_NO_WARNINGS


////函数定义
//#include<stdio.h>
////定义函数Add（加法）
//int Add(int x, int y)//这里只是存在一个形式的x与y是形式参数（形参），只是形式上存在的，不会向内存申请空间，不会真实存在的，所以叫形式参数。
//{
//	return x + y;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d%d", &a, &b);//这里传递的a与b是实际参数（实参），实际参数就是真实传递给函数的参数。
//	int c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}



//数组做函数参数
//函数的声明和定义，还有调用（字面意思）
//#include<stdio.h>
//
//void set_arr(int arr1[10], int sz1);//先对函数做一个声明，后面再做定义，当然也可以将函数定义放在调用前
//void print_arr(int arr2[10], int sz2);
//
//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	print_arr(arr, sz);//这里为对函数做一个调用
//	printf("\n");
//
//	set_arr(arr, sz);//定义数组内容为-1
//
//	print_arr(arr, sz);//打印数组内容,函数具体定义在下面
//
//	return 0;
//}
//void set_arr(int arr1[10],int sz1)//这里arr1[10]可以换为arr[10],sz1可以换为sz，没有影响
//{
//	int i = 0;
//	for (i = 0; i < sz1; i++)
//	{
//		arr1[i] = -1;
//	}
//}
//void print_arr(int arr2[10],int sz2)
//{
//	int i = 0;
//	for (i = 0; i < sz2; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//}


////嵌套调用
//#include<stdio.h>
//int is_leap_year(int a)//a为年，b为月
//{
//	if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)
//		return 1;
//	else
//		return 0;
//}
//int get_days_of_month(int a,int b)
//{
//	int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//arr[0-12]从左到右对应，但2月有28和29天两种情况，判断闰年有29天
//	int c = arr[b];
//	if (is_leap_year(a) && b == 2)//闰年且二月
//		c += 1;
//	return c;
//}
//int main()
//{
//	int a = 0;//年
//	int b = 0;//月
//	scanf("%d%d", &a, &b);
//	int c = get_days_of_month(a, b);
//	printf("%d", c);
//	return 0;
//}
////明显在调用的get_days_of_month函数中还调用了is_leap_year函数，数嵌套调用

////链式访问
//#include<stdio.h>
//int main()
//{
//	printf("%d\n", printf("%d", printf("%d", 43)));//先执行最内部的打印43，然后打印（printf（"%d",43））打印结果为2(也就是两个字符)，然后再打印（printf（"%d",2））打印结果为1(也就是一个字符)
//	printf("%d\n", printf("%d", printf("%d ", 43)));//空格也算一个字符
//	return 0;
//}
////所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数，像链条⼀样将函数串起来就是函数的链式访问。



//函数文件的拆分
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d%d", &a, &b);
//	int c = Add(a, b);
//	printf("%d", c);
//	return 0;
//}
////在这里我将函数的声明放在了add.h(头文件(.h))中，函数的定义放在了add1.c(源文件(.c))中，然后在add.c中运行
////再声明一下函数的定义和声明不影响下面函数的调试(自己的理解)



//static(意思是静态的)和extern(用来声明外部符号的)

//static修饰局部变量
//#include<stdio.h>
//int test()
//{
//	static int i = 0;//用static修饰后，只定义了一次i，后面输出的i的值返回重新使用
//	//int i = 0;//不用static修饰时每使用一次test都要重新定义一下i
//	i++;
//	printf("%d ", i);
//}
////结论：static修饰局部变量改变了变量的⽣命周期，⽣命周期改变的本质是改变了变量的存储类型，本
////来⼀个局部变量是存储在内存的栈区的，但是被 static 修饰后存储到了静态区。存储在静态区的变
////量和全局变量是⼀样的，⽣命周期就和程序的⽣命周期⼀样了，只有程序结束，变量才销毁，内存才
////回收。但是作⽤域不变的。
////就目前的理解而言可以这样看，static后的定义使用一次后就到了拎一个空间，不再使用
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//		test();
//	return 0;
//}

//static修饰全局变量,具体作用同修饰函数
//static修饰函数，具体作用见add.c
//使⽤建议：⼀个函数只想在所在的源⽂件内部使⽤，不想被其他源⽂件使⽤，就可以使⽤ static 修饰。


////extern声明外部符号
//#include<stdio.h>
//extern int g_val;
////比如说这里extern声明了在add1.c中定义的全局符号g_val
//int main()
//{
//	printf("%d\n", g_val);
//	return 0;
//}
////如果⼀个全局的符号在A⽂件中定义的，在B⽂件中想使⽤，就可以使
////⽤ extern 进⾏声明，然后使⽤。




